202602021508 python如何在将contextVar带到子线程中
202602021508 python如何在将contextVar带到子线程中
import time
from concurrent.futures import ThreadPoolExecutor
from contextvars import copy_context, ContextVar
trace_id = ContextVar("trace_id")
def work(x):
time.sleep(x)
print("trace_id =", trace_id.get(None), "x =", x)
def submit_with_context(pool, fn, *args, **kwargs):
ctx = copy_context()
return pool.submit(ctx.run, fn, *args, **kwargs)
trace_id.set("REQ-123")
with ThreadPoolExecutor(max_workers=2) as pool:
f1 = submit_with_context(pool, work, 1)
f2 = submit_with_context(pool, work, 2)
f3 = pool.submit(work, 3)
f1.result()
f2.result()
f3.result()
会将ContextVar带到子线程中
输出:
trace_id = REQ-123 x = 1
trace_id = REQ-123 x = 2
trace_id = None x = 3
特别适合在做trace的时候,将 contextVar 传到子线程中